/*
 *
 * Copyright (C) 2008 Jose Javier García Zornoza.
 *
 * Este es un programa libre; puedes distribuirlo y/o modificarlo bajo
 * los términos de la versión 2 (o cualquier versión posterior) de la Licencia
 * Pública General de la Fundación de Software Libre.
 * Este programa se distribuye con la esperanza  de poder ser útil, pero sin
 * NINGUNA GARANTIA; tampoco la garantía implícita de COMERCIALIZACION o DEDICACIÓN
 * A UN PROPOSITO PARTICULAR. Ver la licencia GNU GPL para más detalles.
 * Deberías haber recibido una copia de la licencia GNU GPL con este programa;
 * en caso contrario puedes obtener una copia visitando el sitio web www.fsf.org
 * o escribiendo a la Fundación de Software Libre, Inc., 59 Temple
 * Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 */
package org.gruposp2p.dnie.crypto;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.UnrecoverableKeyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Enumeration;

/**
 *
 * @author jj
 */
public class PKCS11KeyStore {

    private static Logger logger = LoggerFactory.getLogger(PKCS11KeyStore.class);

    public static final String CERT_AUTENTICATION = "CertAutenticacion";
    public static final String CERT_SIGN = "CertFirmaDigital";

    private static final String PKCS11_KEYSTORE_TYPE = "PKCS11";
    private KeyStore keyStore;

    public PKCS11KeyStore(String p11LibPath, String aSmartCardPIN)
            throws KeyStoreException, IOException, NoSuchAlgorithmException,
            CertificateException, UnrecoverableKeyException {
        InputStream inputStream = null;
        Provider pkcs11Provider = null;
        synchronized (this) {
            inputStream = new ByteArrayInputStream(("name = USER-PKCS11\r" +
                    "library = " + p11LibPath + "\r").getBytes());
            pkcs11Provider = new sun.security.pkcs11.SunPKCS11(inputStream);
        }
        Security.addProvider(pkcs11Provider);
        char[] pin = aSmartCardPIN.toCharArray();
        keyStore = KeyStore.getInstance(PKCS11_KEYSTORE_TYPE, pkcs11Provider);
        keyStore.load(inputStream, pin);
    }

    public Enumeration<String> getKeyStoreAliases () throws KeyStoreException {
        return keyStore.aliases();
    }

    public X509Certificate getCertificate(String alias) throws KeyStoreException {
        return (X509Certificate)keyStore.getCertificate(alias);
    }

    public PrivateKey getPrivateKey(String alias, String aSmartCardPIN)
            throws KeyStoreException, NoSuchAlgorithmException,
            UnrecoverableKeyException {
        PrivateKey privateKey = (PrivateKey) keyStore.getKey(
                alias, aSmartCardPIN.toCharArray());
        return privateKey;
    }

}